package com.thinkit.bigdata.web.service.sec;

import com.thinkit.bigdata.core.feature.orm.mybatis.Page;
import com.thinkit.bigdata.web.model.sec.QcRelationDto;
import com.thinkit.bigdata.web.model.sec.SysGroup;
import com.thinkit.bigdata.web.model.sec.User;
import com.thinkit.bigdata.web.model.sec.UserExample;
import org.apache.ibatis.annotations.Param;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;
import java.util.Map;

/**
 * 用户 业务 接口
 *
 * @author StarZou
 * @since 2014年7月5日 上午11:53:33
 **/
public interface UserService {

    /**
     * 用户验证
     *
     * @param user
     * @return
     */
    User authentication(User user);

    /**
     * 根据用户名查询用户
     *
     * @param username
     * @return
     */
    User selectByUsername(String username);

    /**
     * 根据坐席工号查询用户
     *
     * @param seatId
     * @return
     */
    User selectBySeatId(String seatId);

    List<Long> getAllSubGroupId(String areaId);

    /**
     * 分页条件查询
     *
     * @param page
     * @param example
     * @return
     */
    List<User> selectByExampleAndPage(Page<User> page, UserExample example);

    int insert(User record);

    int update(User record);

//    int delete(Long id);

//    int delete(User record);

//    int deleteByExample(UserExample example);

    List<User> selectByExample(UserExample example);

    int updateByExampleSelective(@Param("record") User record, @Param("example") UserExample example);

    /**
     * 因为涉及到重置密码后 再次登录要强制修改密码 要设置pswSetTime字段为null
     * 使用updateByExampleSelective方法可能会影响其他程序 所以单独写一个方法 同时实现：修改用户状态为过期、重置密码、设置pswSetTime为null
     * @param record
     * @param example
     * @return
     */
    int updateByExampleForCron(@Param("record") User record, @Param("example") UserExample example);

//    int updateByExample(@Param("record") User record, @Param("example") UserExample example);

    int updateByPrimaryKeySelective(User record);

//    int updateByPrimaryKey(User record);

    User getUserByPK(Long id);

    Integer deleteUser(List<Long> idList);

    QcRelationDto selectedSeat(Long userId);

    Integer insertQcRelation(QcRelationDto qcRelation);

    int countByExample(UserExample example);

    Integer insertUsers(List<User> userList);

    List<User> selectUserByAreaId(Long areaId);

    List<Map<String, Object>> selectAccountByAreaGroupId(Long areaId, Long seatGroupId);

    List<User> selectSeatIdByAread(String code);

    // 查询一个组下所有得坐席
    List<User> selectSeatIdByGroupId(Long groupId);

    // 根据质检人员的id和质检人员所在组的id查询其管辖的坐席人员的id
    List<User> selectSeatIdByQc(Long userId, Long groupId);

    // 根据质检人员id 查询出质检人员所管辖的坐席组信息
    List<SysGroup> selectManagedSeatGroupByUserId(Long userId);

    // 查询所有坐席
    List<Map<String, Object>> selectAllSeat();

    // 查询不同页面的创建人信息
    List<Map<String, Object>> selectCreateUser(Map<String, Object> params);

    // 初始化用户密码 为了实现初始化密码后用户首次登录强制修改密码 需要设置登录时间为null
    Integer updateInitPasswordByPrimaryKey(User user);

    // 按条件导出用户信息
    List<Map<String, Object>> selectUserDataToExport(UserExample example);

    // 根据角色id查询用户id
    List<Long> selectUserIdByRoleId(List<Long> roleIdList);

    /**
     * 根据userId获取其组员userId（含自己）
     * 组长组员必须属于同一组织机构
     *
     * @param userId 用户id
     * @return List<Long> 用户ids
     */
    List<Long> selectMemberIdByLeaderId(Long userId);

    List<User> selectUserListById(List userId);

}
